/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.servicoimpl;

import br.com.deployment.entidade.empresa.Fornecedor;
import br.com.deployment.entidade.selo.DetalheEntradaSelo;
import br.com.deployment.entidade.selo.EntradaSelo;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.interfaces.EntradaSeloDaoIn;
import br.com.deployment.servico.DetalheEntradaSeloServico;
import br.com.deployment.servico.EntradaSeloServico;
import br.com.deployment.servico.SeloServico;
import br.com.deployment.servico.UsuarioServico;
import br.com.deployment.utilitario.Msg;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;

/**
 *
 * @author luciano
 */
@Stateless
@LocalBean
public class EntradaSeloServicoImpl implements EntradaSeloServico {

    @EJB
    EntradaSeloDaoIn dao;
    
    @EJB
    private SeloServico seloServico;
    @EJB
    private UsuarioServico usuarioServico;
    
    @EJB
    private DetalheEntradaSeloServico detalheEntradaSeloServico;

    @Override
    public void salvar(EntradaSelo entradaSelo) {
//        try {
            entradaSelo.setDataEntrada(new Date());
            List<DetalheEntradaSelo> lst = new ArrayList<DetalheEntradaSelo>();

            for (DetalheEntradaSelo des : entradaSelo.getListDetalhe()) {
                if (!verificaExistencia(des)) {
                    des.setEntradaSelo(entradaSelo);
                    lst.add(des);
                } else {
                    Msg.messagemError(des.getTipoSelo().getNome() + " Já contém selos com os dados informados: ");
                    return;
                }
            }
            entradaSelo.setUsuario(usuarioServico.verificarUsuarioNome(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName()));
            List<DetalheEntradaSelo> detalheEntradaSelos = new ArrayList<DetalheEntradaSelo>();
            for (DetalheEntradaSelo des : lst) {
                des.setSelos(geraSelo(des, entradaSelo));
                detalheEntradaSelos.add(des);
            }
            entradaSelo.setListDetalhe(detalheEntradaSelos);

            dao.save(entradaSelo);
//        } catch (Exception e) {
//            e.printStackTrace();
//            Msg.messagemError("Erro ao salvar entrada selo.");
//        }
    }

    @Override
    public void atualizar(EntradaSelo entradaSelo) {
        try {
            DetalheEntradaSelo detal = new DetalheEntradaSelo();
            entradaSelo.setDataAlteracao(new Date());
            List<DetalheEntradaSelo> lst = new ArrayList<DetalheEntradaSelo>();
            for (DetalheEntradaSelo des : entradaSelo.getListDetalhe()) {
                if (!verificaExistencia(des)) {
                    des.setEntradaSelo(entradaSelo);
                    lst.add(des);
                } else {
                    Msg.messagemError(des.getTipoSelo().getNome() + " Já contém selos com os dados informados: ");
                    return;
                }
            }
            entradaSelo.setUsuario(usuarioServico.verificarUsuarioNome(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName()));
            List<DetalheEntradaSelo> detalheEntradaSelos = new ArrayList<DetalheEntradaSelo>();
            for (DetalheEntradaSelo des : lst) {
                if(detalheEntradaSeloServico.podeModificar(des)){
                    des.setSelos(geraSelo(des, entradaSelo));
                }
                detalheEntradaSelos.add(des);
            }
            entradaSelo.setListDetalhe(detalheEntradaSelos);
            dao.update(entradaSelo);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError("Erro ao atualizar entrada selo.");
        }
    }

    @Override
    public void remover(EntradaSelo entradaSelo) {
        try {
            dao.delete(entradaSelo);
        } catch (Exception e) {
            Msg.messagemError("Erro ao remover entrada selo.");
        }
    }

    @Override
    public EntradaSelo find(int id) {
        try {
            return dao.find(id);
        } catch (Exception e) {
            Msg.messagemError("Erro ao buscar entrada selo.");
        }
        return null;
    }

    @Override
    public EntradaSelo findNome(String nome) {
        try {
            return dao.findNome(nome);
        } catch (Exception e) {
            Msg.messagemError("Erro ao buscar entrada selo.");
        }
        return null;
    }

    @Override
    public List<EntradaSelo> entradaSelos() {
        try {
            return dao.findAll();
        } catch (Exception e) {
            Msg.messagemError("Erro ao buscar entrada selo.");
        }
        return null;
    }

    @Override
    public List<EntradaSelo> findEntradaSelo(EntradaSelo entradaSelo, Fornecedor fornecedor) {
         return dao.findEntradaSelo(entradaSelo, fornecedor);
    }

    private List<Selo> geraSelo(DetalheEntradaSelo des, EntradaSelo es) {
        List<Selo> selos = new ArrayList<Selo>();
        for (int i = des.getNumIni(); i <= des.getNumFim(); i++) {
            Selo selo = new Selo();
            selo.setSerie(des.getSerie());
            selo.setTipoSelo(des.getTipoSelo());
            selo.setProtocolado(false);
            selo.setAtivo(true);
            selo.setDistribuido(false);
            selo.setDetalheEntradaSelo(des);
            selo.setNumero(i);
            selos.add(selo);
        }
        return selos;
    }

    private boolean verificaExistencia(DetalheEntradaSelo desVer) {
        Selo s = new Selo();
        if (desVer != null) {
            s.setTipoSelo(desVer.getTipoSelo());
            s.setSerie(desVer.getSerie());
            for (int i = desVer.getNumIni(); i <= desVer.getNumFim(); i++) {
                s.setNumero(i);
                if (desVer.getId() != 0) {
                    if (seloServico.existSeloEditar(s.getNumero(), s.getSerie(), s.getTipoSelo(), desVer.getId())) {
                        return true;
                    }
                } else {
                    if (seloServico.exist(s, false)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    
    public List<EntradaSelo> findAll(){
        return dao.findAll();
    }
}
